
#include<stdio.h>
#include<string.h>
#include<sys/types.h>
#include<fcntl.h>
#include<errno.h>
#include<unistd.h>


int  getlinefile(int fd,char* buf)
{   char c;
    int i=0;//提前赋值，防止随机值导致栈溢出
	int err=0;
   while(1)
  {  int len=read(fd,&c,1);//一个字节一个字节读，放入缓冲区数组中
     if(len<=0)
     	{
     	err=-1;//读取失败
     	break;
     	}
	 else{
	 	if(c=='\r'||c=='\n')
	 		{
	 		  err=0;//读到行结尾
			  break;
	 		}
		else
			{
			 buf[i++]=c;
			}
	 	}
   } 
   buf[i]='\0';
   if(err&&(i==0))
   	{
   	  //读到文件尾部，没有数据
   	  return -1;
   	}
   else
   	{//两种情况：有数据且读到文件结尾，有数据但是没读完
   	return i;
   	}
   
}
void process_data(char*result_buf,char* buf)
{   int level=0;
    char* levels[]={"A","B","C"};
	char name[100];
	int score[4];
   if(buf[0]==0xef)//解决UTF-8编码的文件
   	{
   	 strcpy(result_buf,buf);//字符串复制
	
   	}
   else{
   sscanf(buf,"%99[^,],%d,%d,%d",name,&score[0],&score[1],&score[2]);//逗号分割，将缓冲区的值根据特定格式放入指定位置，为了处理
   
   int sum=score[0]+score[1]+score[2];
	  score[3]=sum;
	  if(sum>=270)
	   {level=0;
	   }
	   else if(sum>=240)
		   {
			level=1;
		   }
	   else 
		   {
		   level=2;
		   }
	   sprintf(result_buf,"%s,%d,%d,%d,%d,%s",name,score[0],score[1],score[2],score[3],levels[level]);//把数据格式化后写入到result_buf中，根据它的类型来改变
      //将后面数据根据数据类型放入buf中，最终buf以字符类型的方式接收
   }
   

}

void write_data(int fd,char *buf)
{
    write(fd,buf,strlen(buf));

}

int main(int argc,char **argv)
{
    int data_fd;//被读文件id
    int result_fd;//被写文件id
	char buffer[1000];//缓冲区
    char result[1000];//经过处理后的缓冲区
    int len;
    if(argc<3)
    {
         printf("Usage:%s [data.csv] [result.csv]",argv[0]);
         return -1;
    }
    data_fd=open(argv[1],O_RDWR);//以读写方式打开
    if(data_fd<0)
    {
     perror("open:");
     return -1;
    }
    
    result_fd=open(argv[2],O_RDWR|O_CREAT|O_TRUNC,0777);//读写方式，创建方式，截断方式打开
      if(result_fd<0)
    {
     perror("open:");
     return -1;
    }
    while(1)
    	{ //获取文件每行内容
    	  
		  len =getlinefile(data_fd,buffer);
		  if(len==-1)//没获取到数据，说明结尾或者出错
		  	{
		  	break;
		  	}
		  //取出数据进行处理，计算
		  else
		  	{
          process_data(result,buffer);
          //写数据到文件中
          write_data(result_fd,result);
		  write(result_fd,"\r\n",2);//为每行添加换行符
		    }
	}

   close(data_fd);
	close(result_fd);

}

